/*
 * QEMU TMS320C66x 用户模式 CPU 执行循环
 *
 * Copyright (c) 2025 [Your Name or Organization]
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

 #include "qemu/osdep.h"          // QEMU 跨平台支持
 #include "qemu.h"                // 用户模式核心定义
 #include "user-internals.h"      // 用户模式内部函数
 #include "cpu_loop-common.h"     // 用户模式通用循环支持

 

 /*
  * C66x 主执行循环，处理指令执行和异常
  */
 void cpu_loop(CPUArchState *env)
 {
     CPUState *cs = env_cpu(env);
     int trapnr;
     int i;
     for (i = 1; i < 4; i++) {
         cpu_exec_start(cs);      // 开始执行周期
         trapnr = cpu_exec(cs);   // 执行 TCG 翻译的代码，捕获异常
         cpu_exec_end(cs);        // 结束执行周期
         process_queued_cpu_work(cs);  // 处理队列中的 CPU 工作
         switch (trapnr) {
         case EXCP_INTERRUPT:        // 中断信号（暂不处理）
             /* 仅标记信号需尽快处理 */
             break;
         default:                    // 未处理的异常
             fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr);
             exit(EXIT_FAILURE);
         }
     }
     printf("数据加载地址A10寄存器: 0x%x\n", env->gpr[10]);
     printf("结果存储地址A15寄存器: 0x%x\n", env->gpr[15]);
     printf("阈值A20寄存器: 0x%x\n", env->gpr[20]);
     printf("计数器A25寄存器: %d\n", env->gpr[25]);
     printf("A9寄存器: 0x%x\n", env->gpr[9]);
     printf("累加值A8寄存器: 0x%x\n", env->gpr[8]);
     printf("等于1时循环跳出A1寄存器: 0x%x\n", env->gpr[1]);
     printf("检查是否溢出A2寄存器: 0x%x\n", env->gpr[2]);
     printf("错误码A11寄存器: 0x%x\n", env->gpr[11]);
     printf("当前pc指向的地址: 0x%x\n", env->pc);
     exit(0);
 }
 
 /*
  * 从 ELF 文件的寄存器状态初始化 C66x CPU 环境
  */
 void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
 {
     int i;
 
     // 初始化 64 个通用寄存器，参考 TI 文档 SPRUGH7 第 2.2 节
     for (i = 0; i < 64; i++) {
         env->gpr[i] = regs->regs[i];  // 从 pt_regs 复制寄存器值
     }
 
     // 设置程序计数器 PC
     env->pc = regs->pc;
     env->gpr[47] = regs->sp;//c66x使用B15寄存器存储栈指针
     printf("pc的初始值: 0x%x\n栈指针sp: 0x%x\n", env->pc, env->gpr[47]);
 }